# -*- coding: utf-8 -*-

# Create your views here.
from datetime import date

from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse

from .cotizaciones import pesos_a_dolares_compra
from ..models import (
    Gastos,
    Empresa,
)
from ..forms import (
    GastosForm,
    SelectorMesAnio,
)

# INGRESOS Y GASTOS


def actualizar_subtotales(request):
    if request.user.is_authenticated() and request.user.is_superuser:
        gastos = Gastos.objects.all()
        #for cliente in gastos:
        #    cuentas_cliente = CuentasClientes.objects.filter(cliente=cliente)
        for gasto in gastos.order_by('fecha', 'id'):
            if gasto.subtotal:
                gasto.subtotal = round(gasto.subtotal, 2)
            if gasto.saldoUSD:
                gasto.saldoUSD = round(gasto.saldoUSD)
            gasto.save()
        actualizar_saldos(gastos)
        return HttpResponse('Hecho!')
    else:
        return HttpResponseRedirect('/')


def actualizar_saldos(gastos):
    """
    Toma un queryset list con las cuentas de un cliente dado
    y recalcula el saldoUSD en cada cuenta
    """
    i = -1
    ultimo_saldo = 0
    # por cada gasto en la cuenta de un cliente
    for gasto in gastos.order_by('fecha', 'id'):
        i += 1
        if i > 0:
            prev = gastos[i - 1]
        else:
            prev = None
        if prev:
            if gasto.moneda == "UYU":
                if gasto.debe > 0 and gasto.haber > 0:
                    debe = pesos_a_dolares_compra(gasto.debe, gasto.fecha) * (-1)
                    haber = pesos_a_dolares_compra(gasto.haber, gasto.fecha)
                    gasto.subtotal = debe + haber
                    gasto.saldoUSD = prev.saldoUSD + gasto.subtotal
                    ultimo_saldo = prev.saldoUSD + gasto.subtotal
                    gasto.save()
                elif gasto.debe > 0:
                    gasto.subtotal = pesos_a_dolares_compra(gasto.debe, gasto.fecha) * (-1)
                    gasto.saldoUSD = prev.saldoUSD + gasto.subtotal
                    ultimo_saldo = prev.saldoUSD + gasto.subtotal
                    gasto.save()
                elif gasto.haber > 0:
                    gasto.subtotal = pesos_a_dolares_compra(gasto.haber, gasto.fecha)
                    gasto.saldoUSD = prev.saldoUSD + gasto.subtotal
                    ultimo_saldo = prev.saldoUSD + gasto.subtotal
                    gasto.save()
            if gasto.moneda == "USD":
                if gasto.debe > 0 and gasto.haber > 0:
                    debe = gasto.debe * (-1)
                    haber = gasto.haber
                    gasto.subtotal = debe + haber
                    gasto.saldoUSD = prev.saldoUSD + gasto.subtotal
                    ultimo_saldo = prev.saldoUSD + gasto.subtotal
                    gasto.save()
                elif gasto.debe > 0:
                    gasto.subtotal = gasto.debe * (-1)
                    gasto.saldoUSD = prev.saldoUSD + gasto.subtotal
                    ultimo_saldo = prev.saldoUSD + gasto.subtotal
                    gasto.save()
                elif gasto.haber > 0:
                    gasto.subtotal = gasto.haber
                    gasto.saldoUSD = prev.saldoUSD + gasto.subtotal
                    ultimo_saldo = prev.saldoUSD + gasto.subtotal
                    gasto.save()
        else:
            if gasto.saldoUSD:
                pass
            else:
                if gasto.moneda == "UYU":
                    if gasto.debe > 0 and gasto.haber > 0:
                        debe = pesos_a_dolares_compra(gasto.debe, gasto.fecha) * (-1)
                        haber = pesos_a_dolares_compra(gasto.haber, gasto.fecha)
                        gasto.subtotal = debe + haber
                        gasto.saldoUSD = gasto.subtotal
                        ultimo_saldo = gasto.subtotal
                        gasto.save()
                    elif gasto.debe > 0:
                        gasto.subtotal = pesos_a_dolares_compra(gasto.debe, gasto.fecha) * (-1)
                        gasto.saldoUSD = gasto.subtotal
                        ultimo_saldo = gasto.subtotal
                        gasto.save()
                    elif gasto.haber > 0:
                        gasto.subtotal = pesos_a_dolares_compra(gasto.haber, gasto.fecha)
                        gasto.saldoUSD = gasto.subtotal
                        ultimo_saldo = gasto.subtotal
                        gasto.save()
                if gasto.moneda == "USD":
                    if gasto.debe > 0 and gasto.haber > 0:
                        debe = gasto.debe * (-1)
                        haber = gasto.haber
                        gasto.subtotal = debe + haber
                        gasto.saldoUSD = gasto.subtotal
                        ultimo_saldo = gasto.subtotal
                        gasto.save()
                    elif gasto.debe > 0:
                        gasto.subtotal = gasto.debe * (-1)
                        gasto.saldoUSD = gasto.subtotal
                        ultimo_saldo = gasto.subtotal
                        gasto.save()
                    elif gasto.haber > 0:
                        gasto.subtotal = gasto.haber
                        gasto.saldoUSD = gasto.subtotal
                        ultimo_saldo = gasto.subtotal
                        gasto.save()
    # retorna el ultimo saldo
    return ultimo_saldo


def actualizar_saldos_gastos(request):
    todos = Gastos.objects.filter(fecha__range=(date(2013, 12, 01), date.today()))
    empresa = Empresa.objects.all()[0]
    empresa.saldo_gastos_usd = actualizar_saldos(todos)
    empresa.saldo_gastos_actualizado = True
    empresa.save()
    return HttpResponseRedirect('/gastos/listado/0/')


def listado_gastos(request, formid=0, mes=str(date.today().month), anio=str(date.today().year)):
    """Listado de Ingresos y Gastos"""
    if request.user.is_authenticated():
        if request.method == 'POST':
            # Form ingreso de nuevo gasto
            if formid == '1':
                form = GastosForm(request.POST)
                form2 = SelectorMesAnio()
                if form.is_valid():
                    registro = form.save()
                    if registro.moneda == 'UYU':
                        if registro.debe > 0 and registro.haber > 0:
                            debe = pesos_a_dolares_compra(registro.debe, registro.fecha) * (-1)
                            haber = pesos_a_dolares_compra(registro.haber, registro.fecha)
                            registro.subtotal = debe + haber
                            registro.save()
                        if registro.debe > 0:
                            registro.subtotal = pesos_a_dolares_compra(registro.debe, registro.fecha) * (-1)
                            registro.save()
                        if registro.haber > 0:
                            registro.subtotal = pesos_a_dolares_compra(registro.haber, registro.fecha)
                            registro.save()
                    if registro.moneda == 'USD':
                        if registro.debe > 0:
                            registro.subtotal = registro.debe * (-1)
                            registro.save()
                        if registro.haber > 0:
                            registro.subtotal = registro.haber
                            registro.save()
                    mes = registro.fecha.month
                    anio = registro.fecha.year
                    empresa = Empresa.objects.all()[0]
                    empresa.saldo_gastos_actualizado = False
                    empresa.save()
                    # Aca debe retornar al mes en el que se estaba ingresando gastos.
                    return HttpResponseRedirect('/gastos/listado/0/%d/%d/' % (mes, anio))
            # Form selector de gastos por mes
            if formid == '2':
                empresa = Empresa.objects.all()[0]
                form = GastosForm()
                form2 = SelectorMesAnio(request.POST)
                if form2.is_valid():
                    mes = form2.cleaned_data['mes']
                    anio = form2.cleaned_data['anio']
                    saldo_anterior = calculo_saldo_mes_anterior_ig(mes, anio)
                    todo = Gastos.objects.filter(fecha__month=mes, fecha__year=anio)
                    variables = RequestContext(request, {
                        'form': form,
                        'form2': form2,
                        'mes': mes,
                        'anio': anio,
                        'todo': todo,
                        'empresa': empresa,
                        'saldo_anterior': saldo_anterior,
                    })
                    return render_to_response('listado_gastos.html', variables)
                else:
                    return HttpResponseRedirect('/gastos/listado/0/')
        # GET
        else:
            empresa = Empresa.objects.all()[0]
            form = GastosForm()
            form2 = SelectorMesAnio()
            if formid == '3':
                mes = 0
                todos = Gastos.objects.all()
                variables = RequestContext(request, {
                    'form': form,
                    'form2': form2,
                    'mes': mes,
                    'todo': todos,
                    'empresa': empresa,
                })
                return render_to_response('listado_gastos.html', variables)
            else:
                mes = str(mes)
                anio = str(anio)
                saldo_anterior = calculo_saldo_mes_anterior_ig(mes, anio)
                todo = Gastos.objects.filter(fecha__month=mes, fecha__year=anio)
                variables = RequestContext(request, {
                    'form': form,
                    'form2': form2,
                    'mes': mes,
                    'anio': anio,
                    'todo': todo,
                    'saldo_anterior': saldo_anterior,
                    'empresa': empresa,
                })
                return render_to_response('listado_gastos.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def editar_gastos(request, gastoid):
    """Edita Ingresos y gastos"""
    if request.user.is_authenticated():
        r = Gastos.objects.get(pk=gastoid)
        if request.method == 'POST':
            form = GastosForm(request.POST, instance=r)
            if form.is_valid():
                registro = form.save()
                if registro.moneda == 'UYU':
                    if registro.debe > 0:
                        registro.subtotal = pesos_a_dolares_compra(registro.debe, registro.fecha) * (-1)
                        registro.save()
                    if registro.haber > 0:
                        registro.subtotal = pesos_a_dolares_compra(registro.haber, registro.fecha)
                        registro.save()
                if registro.moneda == 'USD':
                    if registro.debe > 0:
                        registro.subtotal = registro.debe * (-1)
                        registro.save()
                    if registro.haber > 0:
                        registro.subtotal = registro.haber
                        registro.save()
                mes = registro.fecha.month
                anio = registro.fecha.year
                empresa = Empresa.objects.all()[0]
                empresa.saldo_gastos_actualizado = False
                empresa.save()
                # Aca debe retornar al mes en el que se estaba ingresando gastos.
                return HttpResponseRedirect('/gastos/listado/0/%d/%d/' % (mes, anio))
        else:
            form = GastosForm(instance=r)
        variables = RequestContext(request, {'form': form})
        return render_to_response('editar_gastos.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def check_gastos(request, gastoid):
    """Confirmar antes de eliminar"""
    if request.user.is_authenticated():
        gasto = Gastos.objects.get(pk=gastoid)
        variables = RequestContext(request, {'gasto': gasto})
        return render_to_response('borrado_gastos.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def borrar_gastos(request, gastoid):
    """Elimina Ingresos y gastos"""
    if request.user.is_authenticated():
        r = Gastos.objects.get(pk=gastoid)
        r.delete()
        empresa = Empresa.objects.all()[0]
        empresa.saldo_gastos_actualizado = False
        empresa.save()
        mes = r.fecha.month
        anio = r.fecha.year
        # Aca debe retornar al mes en el que se estaba ingresando gastos.
        return HttpResponseRedirect('/gastos/listado/0/%d/%d/' % (mes, anio))
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def calculo_saldo_mes_anterior_ig(mes, anio):
    """Calcula el saldo del mes anterior"""
    saldo_mes_anterior = []
    saldo_anterior = None
    mes_anterior = mes
    anio_anterior = anio
    while len(saldo_mes_anterior) == 0:
        if mes_anterior == '1':
            mes_anterior = '12'
            anio_anterior = str(int(anio_anterior) - 1)
        else:
            mes_anterior = str(int(mes_anterior) - 1)
        if anio_anterior == '1970':
            saldo_anterior = 0
            break
        else:
            saldo_mes_anterior = Gastos.objects.filter(fecha__month=mes_anterior,
                                                       fecha__year=anio_anterior).order_by('-fecha', '-id')
    if saldo_anterior != 0:
        if len(saldo_mes_anterior) > 0:
            saldo_anterior = saldo_mes_anterior[0].saldoUSD
        else:
            saldo_anterior = 0
    return saldo_anterior